package xyz.lne.researchgroupmanage.service;

import xyz.lne.researchgroupmanage.entity.Task;
import com.baomidou.mybatisplus.extension.service.IService;
import xyz.lne.researchgroupmanage.service.dataTransferObject.TaskDTO;
import xyz.lne.researchgroupmanage.service.dataTransferObject.TaskDetailDTO;
import xyz.lne.researchgroupmanage.service.dataTransferObject.TaskSimpleDTO;
import xyz.lne.researchgroupmanage.service.dataTransferObject.UserCommitTaskDTO;

import java.util.List;

/**
 * <p>
 *  服务类
 * </p>
 *
 * @author team7
 * @since 2021-01-19
 */
public interface TaskService extends IService<Task> {

    /**
     * 发布任务
     * @param taskDTO
     * @param participatedUserId
     * @return
     */

    TaskDetailDTO releaseTask(TaskDTO taskDTO, List<Integer> participatedUserId);

    /**
     * 完成者提交任务
     * 注：提交任务时不允许修改任务完成状态（修改无效），若需修改任务完成状态，需要使用confirmTaskStatus方法
     * @param userCommitTaskDTO
     * @return
     */

    UserCommitTaskDTO commitTask(UserCommitTaskDTO userCommitTaskDTO);

    /**
     * 用户确认加入/拒绝某项任务
     * @param userCommitTaskDTO
     * @return
     */

    UserCommitTaskDTO confirmTaskStatus (UserCommitTaskDTO userCommitTaskDTO);

    /**
     * 查看当前用户发布的任务列表
     * @param userId
     * @return
     */

    List<TaskSimpleDTO> getReleasedTaskListByUserId(Integer userId);

    /**
     * 查看当前用户待完成+未确认的任务列表
     * @param userId
     * @return
     */

    List<TaskSimpleDTO> getParticipatedTaskListByUserId(Integer userId);

    /**
     * 查看当前课题的所有任务
     * @param researchId
     * @return
     */

    List<TaskSimpleDTO> getAllTasksByResearchId(Integer researchId);


    /**
     * 用户具体查看某任务（只能看到自己的提交）
     * @param taskId
     * @param userId
     * @return
     */

    TaskDetailDTO getTaskUserDetailByTaskId(Integer taskId, Integer userId);

    /**
     * 发布者具体查看某任务（任务管理员查看任务）
     * @param taskId
     * @return
     */

    TaskDetailDTO getTaskAdminDetailByTaskId(Integer taskId);

    /**
     * 删除某课题的所有任务
     * @param researchId
     * @return
     */

    Boolean deleteTaskByResearchId(Integer researchId);

    /**
     * 返回当前用户在当前课题中的任务列表
     * @param researchId
     * @return
     */
    List<TaskSimpleDTO> getUserTaskListInResearch(Integer userId,Integer researchId);

    /**
     * 查看当前用户的该任务状态
     * 未完成-0  已完成-1  已拒绝-2  管理员-3
     * @param userId
     * @param taskId
     * @return
     */
    Integer getUserTaskStatus(Integer userId,Integer taskId);

    /**
     * 判断当前任务Id是否合法，合法则无动作，非法则抛出异常
     * @param taskId
     */
    void isLegal(Integer taskId);

    /**
     * 判断当前用户是否接受该任务，但不判断该任务是否已完成
     * 只要该用户没有拒绝该任务，就认定为合法。不合法将抛出异常。
     * @param taskId
     * @param userId
     */
    void isLegal(Integer taskId,Integer userId);

    /**
     * 判断当前用户是否接受该任务并且该任务处于未完成状态，合法则无
     * 动作，非法则抛出异常，实现中将fileId为0的数据库记录中
     * 的status作为任务与用户的关系
     * @param taskId
     * @param userId
     */
    void isLegalCommit(Integer taskId,Integer userId);

    /**
     * 判断传入的用户id是否是taskId对应任务的发布者
     * @param taskId
     * @param userId
     * @return
     */
    Boolean isAdminInTask(Integer taskId, Integer userId);
}
